/*********************************************************************************
 * Software License Agreement (BSD License)
 * Copyright (c) 2012, Carlos D. Correa (info@ngraph.org)
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of netzen nor the
 *    names of its contributors may be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *********************************************************************************/
#ifndef SENSITIVITYVIEW_H
#define SENSITIVITYVIEW_H


#include "glheaders.h"

#include <assert.h>
#include <string.h>
#include <math.h>
#include "renderUtils.h"
#include "mouseUtils.h"
#include "graph.h"
#include "view.h"
#include "ui/uiUtils.h"
#include "controller.h"
#include <sstream>
#include <algorithm>

#include "scatterplot.h"

#include <cluster.h>

typedef double *pdouble;
typedef int* pint;

using namespace std;
class SensitivityPlot: public ScatterPlot{
	typedef struct {
		float x, y;
	} pt;

	PropertyBag* previousSelected;
	bool clustered;
	float *lines;
	string curPropertyDerivX;
	string curPropertyDerivY;
	bool invalidateStreamlines;

	vector<pt> streamline;
	vector<pt> *streamlines;
	int maxSize;

public:
	SensitivityPlot(const char *title);
	virtual ~SensitivityPlot();

	string getPropertyDX();
	string getPropertyDY();	
		
	// functions from scatter plots
	void setup() ;
	void createLines(int n);
	void updateLines();
	void renderLines();

	// computation functions
	void sampleDerivativeND(Node *node, float &vx, float  &vy);
	void sampleDerivative(float x0, float y0, float &vx, float &vy);
	void computeStreamline(int idx, float h = 0.03, int N = 50, bool backwards = true);
	void computeStreamline(Node *node, float h = 0.03, int N = 50, bool backwards =	true);
	void clusterPoints();
	void computeStreamlines();
	void clusterStreamlines();
	void renderStreamline(int k, float /*minv1*/, float /*maxv1*/, float /*minv2*/, float /*maxv2*/, int linewidth = 1);
	void renderStreamline(vector<pt> streamline, float /*minv1*/, float /*maxv1*/, float /*minv2*/, float /*maxv2*/, int linewidth = 1);
	virtual void update(string property);
	virtual void renderPoints();
	virtual void render();


};

View *createSensitivityPlot(string name);

#endif // SENSITIVITYVIEW_H
